﻿using ProjetoIA_Shopping.Utils.Eventos;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace IA.Shopping.UI
{
    public class Loja
    {
        private const int PRIMEIRA_LOJA = 0;
        private const int SEGUNDA_LOJA = 1;

        public bool _LojaJaVisita = false;

        public HashSet<Produto> _produtos { get; set; }

        public static event EventHandler<ProdutoCompradoEventArgs> ProdutoComprado;

        public void adicionar(HashSet<Produto> produtos)
        {
            _produtos = produtos;
        }

        public Produto procurarProduto(Produto produto)
        {
            foreach (Produto p in this._produtos)
            {
                if (p._iD == produto._iD)
                {
                    return p;
                }
            }
            return null;
        }

        public void ComprarItens(Agente cliente, ListaDeCompras lista)
        {
            Console.Write("\nLoja Encontrada!");

            if (_LojaJaVisita)
            {
                Console.Write(" Mas ja Visitada.");
                return;
            }

            _LojaJaVisita = true;

            foreach (int produtoId in lista.produtosRetantes())
            {
                Produto prodDisponivel = buscarProduto(produtoId);
                if (prodDisponivel != null)

                    /* Compra caso: O item nao sido comprado ainda, o valor na lista
                     * seja compativel com o valor na loja e se o cliente tiver 
                     * dinheiro o suficiente para compra-lo.
                    */
                    if (prodDisponivel._Valor == lista.Produto(produtoId)._Valor &&
                        lista._Comprado[lista.PosicaoNaLista(produtoId)] == false &&
                        cliente.Dinheiro >= prodDisponivel._Valor)
                    {
                        lista.MarcarItemComprado(produtoId, cliente.ID);

                        if (ProdutoComprado != null)
                            ProdutoComprado.Invoke(this, new ProdutoCompradoEventArgs { AgenteID = cliente.ID, ProdutoComprado = lista.Produto(produtoId) });

                        cliente.Dinheiro -= prodDisponivel._Valor;
                        Console.Write(String.Format("\nCOMPRA do Agente{0} de {1} !!!! <-----", cliente.ID, prodDisponivel._Nome));
                    }
            }
        }

        public Produto buscarProduto(int id)
        {
            foreach (Produto p in this._produtos)
            {
                if (p._iD == id)
                {
                    return p;
                }
            }
            return null;
        }

        public void criarProdutosParaLoja(int loja)
        {
            _produtos = new HashSet<Produto>();

            switch (loja)
            {
                case PRIMEIRA_LOJA:
                    addGrupo1Essenciais();
                    break;
                case SEGUNDA_LOJA:
                    addGrupo2Essenciais();
                    break;
                default:

                    break;
            }
            addEssenciais();
        }

        private void addGrupo1Essenciais()
        {
            this._produtos.Add(new Produto(0, Produtos.Tipos[0], Util.random.Next(Produto.VALOR_MINIMO, Produto.VALOR_MAXIMO)));
            this._produtos.Add(new Produto(1, Produtos.Tipos[1], Util.random.Next(Produto.VALOR_MINIMO, Produto.VALOR_MAXIMO)));
        }

        private void addGrupo2Essenciais()
        {
            this._produtos.Add(new Produto(2, Produtos.Tipos[2], Util.random.Next(Produto.VALOR_MINIMO, Produto.VALOR_MAXIMO)));
            this._produtos.Add(new Produto(3, Produtos.Tipos[3], Util.random.Next(Produto.VALOR_MINIMO, Produto.VALOR_MAXIMO)));
        }

        private void addEssenciais()
        {
            while (this._produtos.Count < Util.QUANT_PRODUTOS_LOJAS)
            {
                int id = Util.random.Next(0, Produtos.Tipos.Count - 1);
                this._produtos.Add(new Produto(id, Produtos.Tipos[id], Util.random.Next(Produto.VALOR_MINIMO, Produto.VALOR_MAXIMO)));
            }
        }
    }
}
